package uk.co.mmscomputing.application.install;
import java.io.*;
import java.util.*;
public class Engine{
private Log log;
private String javac="";
public Engine(Log log){
this.log=log;
}
public void print(InputStream in){
try{
BufferedReader r=new BufferedReader(new InputStreamReader(in));
String s;
while((s=r.readLine())!=null){
log.msg(s);
}
}catch(Exception e){
log.err(e);
}
}
public void run(String javac, String classpath, String programname){
String cmd="";
String java="";
String osname=System.getProperty("os.name");
if(osname.startsWith("Windows")){
if(javac.endsWith(".exe")){
java=javac.substring(0,javac.length()-5);
}else{
java=javac.substring(0,javac.length()-1);
}
cmd+="\""+java+"\"";
}else{
java+=javac.substring(0,javac.length()-1);
cmd+=java;
}
cmd+=" "+programname;
final String runcmd=cmd;
// final String cmd="java -cp "+classpath+" "+programname;
log.msg("Start : "+cmd);
new Thread(){
public void run(){
try{
final Process p=Runtime.getRuntime().exec(runcmd);
new Thread(){ public void run(){ print(p.getInputStream()); }}.start();
print(p.getErrorStream());
}catch(Exception e){
log.err(e);
}
log.msg("End : "+runcmd);
}
}.start();
}
public void traverse(String dir, String javac)throws Exception{
this.javac=javac;
traverse(dir);
}
private void traverse(String dir)throws Exception{
String[] dirs=listDir(dir);
for(int i=0; i<dirs.length; i++){
traverse(dir+"/"+dirs[i]);
}
compileDir(dir);
}
private void compileDir(String dir)throws Exception{
String[] files=list(dir);
for(int i=0; i<files.length; i++){
compile(dir+"/"+files[i]);
}
}
public void compile(String filename)throws Exception{
String cmd;
String osname=System.getProperty("os.name");
if(osname.startsWith("Windows")){
cmd="\""+javac+"\" \""+filename.replace('\\','/')+"\"";
}else{
cmd=javac+" "+filename.replace('\\','/');
}
log.msg("Compile "+cmd);
final Process p=Runtime.getRuntime().exec(cmd);
new Thread(){ public void run(){ print(p.getInputStream()); }}.start();
print(p.getErrorStream());
}
public String[] list(String dir){
return list(dir, new JavaFNF());
}
public String[] listDir(String dir){
return list(dir, new DirFNF());
}
public String[] list(String dir, FilenameFilter fnf){
String dirs[]=new java.io.File(dir).list(fnf);
if(dirs==null){ log.msg("ERROR list : "+dir); return new String[0];}
java.util.Arrays.sort(dirs);
return dirs;
}
class JavaFNF implements FilenameFilter{
public boolean accept(File dir, String s){
s=dir+"/"+s;
File f=new File(s);
return f.isFile() && s.endsWith(".java");
}
}
class DirFNF implements FilenameFilter{
public boolean accept(File dir, String s){
s=dir+"/"+s;
File f=new File(s);
return f.isDirectory();
}
}
public void metainf(String fn, String spi){
try{
log.msg("META-INF/services/"+fn+" "+spi);
File dir=new File("META-INF/services/");
dir.mkdirs();
File service=new File("META-INF/services/"+fn);
service.createNewFile(); // create the file if it not already exists
BufferedReader in=new BufferedReader(new FileReader(service));
String line;
while((line=in.readLine())!=null){
if(spi.equals(line.trim())){ return;}
}
in.close();
FileWriter out=new FileWriter(service,true);//append
out.write(spi+"\n");
out.flush();
out.close();
}catch(Exception e){
log.err(e);
}
}
public void metainf(){
metainf("javax.imageio.spi.ImageReaderSpi","uk.co.mmscomputing.imageio.bmp.BMPImageReaderSpi");
metainf("javax.imageio.spi.ImageReaderSpi","uk.co.mmscomputing.imageio.sff.SFFImageReaderSpi");
metainf("javax.imageio.spi.ImageReaderSpi","uk.co.mmscomputing.imageio.ppm.PPMImageReaderSpi");
metainf("javax.imageio.spi.ImageReaderSpi","uk.co.mmscomputing.imageio.tiff.TIFFImageReaderSpi");
metainf("javax.imageio.spi.ImageWriterSpi","uk.co.mmscomputing.imageio.bmp.BMPImageWriterSpi");
metainf("javax.imageio.spi.ImageWriterSpi","uk.co.mmscomputing.imageio.sff.SFFImageWriterSpi");
metainf("javax.imageio.spi.ImageWriterSpi","uk.co.mmscomputing.imageio.ppm.PBMImageWriterSpi");
metainf("javax.imageio.spi.ImageWriterSpi","uk.co.mmscomputing.imageio.ppm.PGMImageWriterSpi");
metainf("javax.imageio.spi.ImageWriterSpi","uk.co.mmscomputing.imageio.ppm.PPMImageWriterSpi");
metainf("javax.imageio.spi.ImageWriterSpi","uk.co.mmscomputing.imageio.tiff.TIFFImageWriterSpi");
metainf("javax.sound.sampled.spi.MixerProvider","uk.co.mmscomputing.sound.provider.MixerProvider");
// metainf("javax.sound.sampled.spi.MixerProvider","uk.co.mmscomputing.device.capi.sound.CapiMixerProvider");
}
}